package add_two_numbers;

public class Solution {

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        Boolean flag = true;
        Boolean add = add(l1, l2, 0, flag);
        return add ? l1 : l2;
    }

    private Boolean add(ListNode l1, ListNode l2, int i, Boolean flag) {
        if (l1.next == null && l2.next == null) {
            int val = l1.val + l2.val + i;
            i = val / 10;
            int res = val % 10;
            l1.val = res;
            l2.val = res;
            if (i > 0) {
                if (flag) {
                    l1.next = new ListNode(i);
                } else {
                    l2.next = new ListNode(i);
                }
            }
            return flag;
        }

        if (l1.next != null && l2.next == null) {
            flag = true;
            int val = l1.val + l2.val + i;
            i = val / 10;
            int res = val % 10;
            l1.val = res;
            if (i > 0) {
                add(l1.next, new ListNode(0), i, flag);
            }
            return flag;
        } else if (l1.next == null && l2.next != null) {
            flag = false;
            int val = l2.val + l1.val + i;
            i = val / 10;
            int res = val % 10;
            l2.val = res;
            if (i > 0) {
                add(new ListNode(0), l2.next, i, flag);
            }
            return flag;
        }
        int val = l1.val + l2.val + i;
        i = val / 10;
        int res = val % 10;
        l1.val = res;
        l2.val = res;

        return add(l1.next, l2.next, i, flag);
    }
}
